home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 March
/
EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso
/
earcd
/
util1
/
rdbmnt12.lha
/
RDBMount_1_2
/
RDBMount.c‾
< prev
next >
Wrap
Text File
|
1994-08-16
|
7KB
|
223 lines
/*
* Copyright © 1991 by S.R. & P.C.
*
* Created: 28 Mar 1993
* Modified: 20 May 1993 11:43:01
*
* Make>> SC <file>.c
* Make>> SLink Lib:Entry.o <file>.o LIB Lib:String.lib MAP <file>.map F,H,L,O,S,X NOICON VERBOSE SmallCode SmallData BATCH
* Ma ke>> SLink Lib:Entry.o <file>.o LIB Lib:Startup.lib Lib:String.lib MAP <file>.map F,H,L,O,S,X NOICON VERBOSE SmallCode SmallData BATCH
*/
#include <Main.h>
#include <StringLib.h>
#include <Libraries/HardBlocks.h>
/*#include <pragmas/HardBlocks_pragmas.h>*/
#define MAXSTRINGLEN 255/2
#define MAXNUMARGS 64
#define MAXDEFAULTLEN 512/2
STRPTR Template = "DosDev/M/A,ExecDev,UnitNr/N";
#define ARG_DosDevA 0
#define ARG_ExecDev 1
#define ARG_UnitNr 2
#define ARG_ENDARG 3
STRPTR CliHelp = "RDBMount V1.0
© 1993 S.R.
\n\
Usage: RDBMount <DosDevName> [ExecDevName] [ExecUnitNr]\n\
Default: ExecDevName = scsi.device ExecUnitNr = 0 or read Env \"RDBMount.DefOpts\"\n\
Use to mount DOS Dev from the RigidDiskBlock information stored on (HD) drive\n";
struct DosLibrary *DOSBase;
struct Library *UtilityBase;
struct Library *ExpansionBase;
struct Library *HardBlocksBase;
char *B2CStr( UBYTE *BStr, char Buff[])
{
UBYTE i;
for ( i = 0; i < *BStr; i++)
{
Buff[ i] = (BStr + 1)[ i];
}
Buff[ i] = '\0';
return Buff;
}
BOOL IsMounted( char DosName[])
{
struct DosList *DList;
BOOL Found = FALSE;
DList = LockDosList( LDF_DEVICES|LDF_READ);
Found = (BOOL) FindDosEntry( DList, DosName, LDF_DEVICES);
UnLockDosList( LDF_DEVICES|LDF_READ);
return Found;
}
ULONG __asm Main(register __a0 APTR ArgV[], register __a1 struct WBStartup * WBenchMsg);
ULONG __asm __Main(register __d2 ULONG CmdLen, register __a2 STRPTR CmdPtr)
{
struct Process *pp;
ULONG RC = 1001; /* assumle the worst */
pp = (struct Process *) FindTask(0L);
if (DOSBase = (struct DosLibrary *) OpenLibrary("dos.library", 34L))
{
if (DOSBase->dl_lib.lib_Version > 36)
{
APTR ArgV[MAXNUMARGS];
struct RDArgs *RA;
struct RDArgs *DefaultRDArgs;
UtilityBase = DOSBase->dl_UtilityBase;
if (RA = AllocDosObject(DOS_RDARGS, NULL))
{
memset(ArgV, 0, MAXNUMARGS * sizeof(APTR));
RA->RDA_ExtHelp = CliHelp;
/* first read default */
/* getting the default string */
if (DefaultRDArgs = AllocDosObject(DOS_RDARGS, NULL))
{
UBYTE Default[ MAXDEFAULTLEN] = "DosDev Dummy ExecDev scsi.device UnitNr 0";
if ( (DefaultRDArgs->RDA_Source.CS_Length = GetVar("RDBMount.DefOpts", Default, MAXDEFAULTLEN - 1, 0L)) > 0)
;
else
DefaultRDArgs->RDA_Source.CS_Length = strlen( Default);
{
/* let ReadArgs() allocate neccesary buffer sinc I use diferrent RDArgs for Default and CLI opts */
/* Ok I succefuly read a Default Option string now parse it */
Default[DefaultRDArgs->RDA_Source.CS_Length++] = '\n'; /* this is need by ReadArgs() */
Default[DefaultRDArgs->RDA_Source.CS_Length] = '\0'; /* this is need by ReadArgs() */
DefaultRDArgs->RDA_Source.CS_Buffer = Default;
DefaultRDArgs->RDA_Source.CS_CurChr = 0;
DefaultRDArgs->RDA_Flags = RDAF_NOPROMPT;
if (!ReadArgs(Template, (long *) ArgV, DefaultRDArgs))
{
PutStr("Error in Default:");
PrintFault(IoErr(), NULL);
memset(ArgV, 0, MAXNUMARGS * sizeof(APTR));
}
DefaultRDArgs->RDA_Source.CS_Buffer = NULL; /* Now ReadArgs() from Command line */
/* the ArgV is leaving unchanged: the second ReadArgs() take actual value as default */
}
}
/* Let ReadArgs() allocate necessay buffer rather using stack space */
if (ReadArgs(Template, (long *) ArgV, RA))
{
RC = Main(ArgV, NULL);
}
else
{
PrintFault(IoErr(), NULL);
RC = 20;
}
FreeDosObject(DOS_RDARGS, RA);
/* Free RDargs now I don't need the option value */
if (DefaultRDArgs)
FreeDosObject(DOS_RDARGS, DefaultRDArgs);
}
}
else
{
Write(pp->pr_COS, "You need KickStart 2.0+\n", 24L);
RC = 1000;
}
CloseLibrary((struct Library *) DOSBase);
}
return RC;
}
ULONG __asm Main( register __a0 APTR ArgV[], register __a1 struct WBStartup *WBenchMsg)
{
ULONG RC = 20; /* default :Don't find desired Partition */
ExpansionBase = OpenLibrary( "expansion.library", 37L);
if ( HardBlocksBase = OpenLibrary(HardBlocksName, HardBlocksVersion))
{
struct RigidDiskBlock rdb;
if ( !(RC = LoadHardBlocks( &rdb, ArgV[ ARG_ExecDev], *(( ULONG *)ArgV[ ARG_UnitNr]))))
{
#define MAXMOUNT 10
ULONG parmPkt[ MAXMOUNT][ 21 + 10]; /* WARN: this is a lenthg which can change */
char DevNames[ MAXMOUNT][ 20]; /* mem string don't be lost until the mount */
UBYTE MountCnt = 0;
UBYTE i, j;
char *Str;
for ( i = 0, Str = ( (char **)ArgV[ ARG_DosDevA])[ 0]; Str && ( i < MAXMOUNT); i++, Str = ( (char **)ArgV[ ARG_DosDevA])[ i])
{
BOOL Found = FALSE;
struct PartitionBlock *PB;
char Buff[ MAXSTRINGLEN];
char DosDevName[ MAXSTRINGLEN];
strcpy( DosDevName, Str);
{
UBYTE l;
if ( DosDevName[ l = (strlen( DosDevName) - 1)] == ':')
DosDevName[ l] = '\0';
}
if ( !IsMounted( DosDevName))
{
for ( PB = (struct PartitionBlock *) rdb.rdb_PartitionList; PB && !Found; PB = (struct PartitionBlock *)PB->pb_Next)
{
B2CStr( PB->pb_DriveName, Buff);
// Printf( "Dos Name:\"%s\"\n", Buff);
// Printf("pb:%lx, next:%lx\n", PB, PB->pb_Next);
if ( !Strnicmp( DosDevName, Buff, MAXSTRINGLEN))
{
strcpy( DevNames[ MountCnt], Buff);
parmPkt[ MountCnt][ 0] = (ULONG)DevNames[ MountCnt];
parmPkt[ MountCnt][ 1] = (ULONG)ArgV[ ARG_ExecDev];
parmPkt[ MountCnt][ 2] = *( (ULONG *)ArgV[ ARG_UnitNr]); /* unit number */
parmPkt[ MountCnt][ 3] = 0; /* OpenDevice flags */
CopyMem( PB->pb_Environment, &parmPkt[ MountCnt][ 4], sizeof( PB->pb_Environment));
Found = TRUE;
MountCnt++;
}
}
if ( !Found)
Printf( "\"%s:\" not found.\n", DosDevName);
}
else
{
Printf( "\"%s:\" alredy mounted.\n", DosDevName);
}
}
for ( j = 0; j < MountCnt; j++)
{
struct DeviceNode *DeviceNode;
if ( DeviceNode = MakeDosNode( parmPkt[ j]))
{
if ( !AddDosNode( -128, ADNF_STARTPROC, DeviceNode))
{
Printf( "\"%s\" can't be Mounted\n", parmPkt[ j][ 0]);
}
}
}
FreeHardBlocks(&rdb);
}
else
Printf( "Unable to Load RDB from \"%s\" %ld\n", ArgV[ ARG_ExecDev], *( (ULONG *)ArgV[ ARG_UnitNr]));
CloseLibrary(HardBlocksBase);
}
else
Printf( "Unable to open hardblocks.library V1+\n");
CloseLibrary( ExpansionBase);
return RC;
}